打印
[51单片机]

8*8点阵显示问题

[复制链接]
879|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuandaoxy|  楼主 | 2021-2-19 21:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个51加上两个595,显示数据很正常,图形写好数组,把驱动放进主循环,一点错没有,显示也正常,可是我用串口来驱动显示的时候,竟然会出现乱码,后来想到命令太快,中间加一个清屏的命令,就是把点阵都灭了
再去显示,可是还是不行,问题处在了哪里?主循环如下
        for(j=0;j<8;j++)
         {
             Send_Byte(Table2[j]);   //送每一行的列选值
             Send_Byte(row);        //分别扫描每一行,一次一行
             R_CLK=1;               //Send_Byte中置低了
             R_CLK=0;               //再次变低
             row=_cror_(row,1);
                         
         }

使用特权

评论回复

相关帖子

沙发
LcwSwust| | 2021-2-19 21:22 | 只看该作者
这里的代码看不出问题
“串口来驱动显示”详细说一下。

使用特权

评论回复
板凳
xyz549040622| | 2021-2-19 22:07 | 只看该作者
没有看懂。你的代码里面没有描述是怎么用串口控制的,怎么用串口驱动显示的?

使用特权

评论回复
地板
chuandaoxy|  楼主 | 2021-2-20 09:15 | 只看该作者
LcwSwust 发表于 2021-2-19 21:22
这里的代码看不出问题
“串口来驱动显示”详细说一下。

感谢楼上的回复,其实串口部分很简单
void process()

{
         uchar xdata Com;
          
        if(0x35==read_p[0])

        {          
           Com=read_p[1];// 取出命令

          if(Com==0x36)

                { dip=1;} //显示第一个字符
               
                if(Com==0x37)

                { dip=2;} //显示第二个字符               
                       
   }       

对应主循环里的如下
while(1)
     {
         

                 if(dip==1)

        {  
                  
                   for(j=0;j<8;j++)
         {
             Send_Byte(Table1[j]);   //送每一行的列选值                  清屏20ms然后去显示新的图形
             Send_Byte(row);        //分别扫描每一行,一次一行
             R_CLK=1;               //Send_Byte中置低了
             R_CLK=0;               //再次变低
             row=_cror_(row,1);                                                  
           }
                 }
                               
                 

使用特权

评论回复
5
LcwSwust| | 2021-2-20 09:23 | 只看该作者
chuandaoxy 发表于 2021-2-20 09:15
感谢楼上的回复,其实串口部分很简单
void process()

这些代码看起来也是没有问题的,要不row在循环之前给个初值看看?

使用特权

评论回复
6
chuandaoxy|  楼主 | 2021-2-20 11:55 | 只看该作者
LcwSwust 发表于 2021-2-20 09:23
这些代码看起来也是没有问题的,要不row在循环之前给个初值看看?

给了,我总是怀疑595的反应速度慢,需要延时,但是尝试几种方法都没起作用

void main()
{
     uchar j=0,row;

         My_OE  =0;

         

         Init_Com();

         ES=1;

         EA=1;

         row=0x80;

     while(1)
     {


                 if(dip==1)

        {  /*        if(dis==1) {
                  
                   for(j=0;j<8;j++)
         {
             Send_Byte(Table1[j]);   //送每一行的列选值                  清屏20ms然后去显示新的图形
             Send_Byte(row);        //分别扫描每一行,一次一行
             R_CLK=1;               //Send_Byte中置低了
             R_CLK=0;               //再次变低
             row=_cror_(row,1);                                                  
           }
                 }*/

使用特权

评论回复
7
chuandaoxy|  楼主 | 2021-2-20 12:29 | 只看该作者
本帖最后由 chuandaoxy 于 2021-2-20 12:43 编辑
chuandaoxy 发表于 2021-2-20 11:55
给了,我总是怀疑595的反应速度慢,需要延时,但是尝试几种方法都没起作用

void main()

现在测试的现象是,如果在主循环存在选择,就会乱码,如果就显示一个图形,是正确的

最新的尝试如下,也没成功
while(1)
     {
          row=0x80;

               
                   for(j=0;j<8;j++)
         {

                         if(dip==1)
                         {Send_Byte(Table1[j]);  }
                         if(dip==2)
                         {Send_Byte(Table[j]);  }
                         if(dip==3)
                         {Send_Byte(Table2[j]);  }
             Send_Byte(row);        //分别扫描每一行,一次一行
             R_CLK=1;               //Send_Byte中置低了
             R_CLK=0;               //再次变低
             row=_cror_(row,1);                                                  
           }
                 }
               

使用特权

评论回复
8
LcwSwust| | 2021-2-20 14:01 | 只看该作者
chuandaoxy 发表于 2021-2-20 12:29
现在测试的现象是,如果在主循环存在选择,就会乱码,如果就显示一个图形,是正确的

最新的尝试如下,也 ...

那就不是串口的问题了
while(1)之前给dip一个值呢

使用特权

评论回复
9
chuandaoxy|  楼主 | 2021-2-20 14:10 | 只看该作者
LcwSwust 发表于 2021-2-20 14:01
那就不是串口的问题了
while(1)之前给dip一个值呢

给了,如下,就是关闭显示的命令
EA=1;

          row=0x80;

               
                   for(j=0;j<8;j++)
         {

                        
                         Send_Byte(Table1[j]);  
                        
             Send_Byte(row);        //分别扫描每一行,一次一行
             R_CLK=1;               //Send_Byte中置低了
             R_CLK=0;               //再次变低
             row=_cror_(row,1);                                                  
           }
                 
               

        

     while(1)

使用特权

评论回复
10
LcwSwust| | 2021-2-20 18:27 | 只看该作者
chuandaoxy 发表于 2021-2-20 14:10
给了,如下,就是关闭显示的命令
EA=1;

没看到,我的意思是:

dip=1;
while(1)
{
row=0x80;
for......
}

使用特权

评论回复
11
chuandaoxy|  楼主 | 2021-2-22 11:12 | 只看该作者
LcwSwust 发表于 2021-2-20 18:27
没看到,我的意思是:

dip=1;

还是不行,奇了怪了。

使用特权

评论回复
12
LcwSwust| | 2021-2-22 11:56 | 只看该作者
chuandaoxy 发表于 2021-2-22 11:12
还是不行,奇了怪了。

真奇怪
若是不涉密,可以把完整的工程发上来看看。

使用特权

评论回复
13
ningling_21| | 2021-2-23 14:01 | 只看该作者
串口输出不符合595的时序要求?
不用串口驱动显示正常?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

855

主题

1044

帖子

4

粉丝