用点阵显示一个静态 汉字 求高手检查一下
解决时间 2021-02-16 17:01
- 提问者网友:我的未来我做主
- 2021-02-15 18:34
#include
#include
#define uint unsigned int
#define unchar unsigned char
unchar code tab[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1f,0,0x1f};
sbit E=P1^4; //译码器154的使能信号
sbit LOCK=P2^0; //595的锁存信号
void delay();
void main()
{
uint i;
unchar w;
P1=0xFF;
while(1)
{
for(i=0;i<16;i++)
{
LOCK=0;
SCON=0;
while(!TI)
{
w=tab[2*i+1];
SBUF=w;
}
TI=0;
while(!TI)
{
w=tab[2*i];
SBUF=w;
}
TI=0;
while(!TI)
{
LOCK=1;
E=0;
P1=0;
P1=P1+i;
TI=1;
}
}
}
}
编译没错 就是仿真的时候 连续显示低8位2行的时候 只有一行亮,而显示高位两行的时候 两行都亮 求大神改正解答....
最佳答案
- 五星知识达人网友:上分大魔王
- 2021-02-15 19:31
void main()
{
uint i;
SCON = 0;
while(1) {
for(i = 0; i < 16; i++) {
LOCK = 0;
SBUF = tab[2 * i + 1]; while(!TI); TI = 0;
SBUF = tab[2 * i + 0]; while(!TI); TI = 0;
LOCK=1;
P1 = i;
}
}
}
试试看。
全部回答
- 1楼网友:酒安江南
- 2021-02-15 19:54
#include<reg52.h> //包含头文件 #define uint unsigned int //预定义一下 #define uchar unsigned char sbit rs=p3^5; //1602的数据/指令选择控制线 sbit rw=p3^6; //1602的读写控制线 sbit en=p3^7; //1602的使能控制线 uchar code table[]="????"; //要显示的内容1放入数组tablel uchar code table1[]="????"; //要显示的内容2放入数组table1 void delay(uint n) //延时函数 { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void lcd_wcom(uchar com) //1602写命令函数 { rs=0; //选择指令寄存器 rw=0; //选择写 p2=com; //把命令字送入p2 delay(5); //延时一小会儿,让1602准备接收数据 en=1; //使能线电平变化,命令送入1602的8位数据口 en=0; } void lcd_wdat(uchar dat) //1602写数据函数 { rs=1; //选择数据寄存器 rw=0; //选择写 p2=dat; //把要显示的数据送入p2 delay(5); //延时一小会儿,让1602准备接收数据 en=1; //使能线电平变化,数据送入1602的8位数据口 en=0; } void lcd_init() //1602初始化函数 { lcd_wcom(0x38); //8位数据,双列,5*7字形 lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁 lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位 lcd_wcom(0x01); //清屏 } void main() //主函数 { uchar n,m=0; lcd_init(); //液晶初始化 lcd_wcom(0x80); //显示地址设为80h(即00h,)上排第一位 for(m=0;m<16;m++) //将table[]中的数据依次写入1602显示 { lcd_wdat(table[m]); delay(200); } lcd_wcom(0x80+0x44); //重新设定显示地址为0xc4,即下排第5位 for(n=0;n<8;n++) //将table1[]中的数据依次写入1602显示 { lcd_wdat(table1[n]); delay(200); } while(1); //动态停机 }
我要举报
大家都在看
推荐资讯