打印

51内核的ST7920(12864)问题请教

[复制链接]
866|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luyuan1984|  楼主 | 2014-8-31 21:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include <STC12C5A60S2.H>
#include <pwmtiaoguang.H>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint  unsigned int
#define ADC_POWER          0X80
#define ADC_FLAG          0X10
#define ADC_START          0X08
#define ADC_SPEEDLL 0X00
//12864液晶相关I/O设置
sbit RS=P2^0;                         //并行数据/控制字选择 H:数据  L:控制字
sbit RW=P2^1;                         //并行读/写选择       H:读    L:写
sbit E =P2^2;                         //并行读写使能        H有效,下降沿锁定数据
sbit PSB=P2^3;                     //串口,并口选择       H:并口  L:串口(开发板上引脚标识为CS1)
sbit RST=P2^5;                     //复位引脚            L:液晶复位
sbit SI=P3^0;
sbit CLK=P3^1;
uint  Voitage_Value=0;
uchar Voltage_DatCount=0,Cnt=0,Disp_flag=0;
uint  xdata Voltage_Dat[128]={0};
uchar xdata **Cepark[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                                             0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                         };
uchar code Graph[]={0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x04,0x40,0x10,0x50,0x00,0x00,0x00,0x00,
                                       0x00,0x00,0x00,0x00,0x01,0x00,0x7C,0x20,0x04,0x40,0x10,0x48,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x3F,0xF8,0x44,0x50,0x04,0x40,0x20,0x40,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x50,0x04,0x40,0x24,0x5C,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x08,0x20,0x48,0x88,0x7F,0xFC,0x45,0xE0,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x04,0x40,0x51,0x04,0x44,0x44,0xF8,0x40,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0xFF,0xFE,0x4A,0x02,0x44,0x44,0x10,0x5E,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x88,0x44,0x44,0x23,0xE0,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x1F,0xF0,0x44,0x88,0x44,0x44,0x40,0x44,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x10,0x10,0x44,0x88,0x7F,0xFC,0xFC,0x48,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x10,0x10,0x44,0x88,0x44,0x44,0x40,0x30,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x1F,0xF0,0x68,0x88,0x44,0x44,0x00,0x22,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x10,0x10,0x50,0x88,0x44,0x44,0x1C,0x52,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x10,0x10,0x41,0x08,0x44,0x44,0xE0,0x8A,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x1F,0xF0,0x41,0x08,0x7F,0xFC,0x43,0x06,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x10,0x10,0x42,0x08,0x40,0x04,0x00,0x02,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                   };
//////////////////////////////////////////////
///////////   延时函数       ////////////////
////////////////////////////////////////////                                                   
void delay(uint m)
{
uint i=0;
while(i<m)
      {
           i++;
          }              
}
void Delay10ms()                //@12.000MHz//延时10毫秒
{
unsigned char i, j;
_nop_();
_nop_();
i=117;
j=183;
do
  {
   while (--j);
  }
while (--i);
}
//////////////////////////////////////////////
///////////   初始化函数     ////////////////
////////////////////////////////////////////
void   Iint_Parameter(void)
{                                                  
P1ASF=0X01;                                                                         //设置P1.0口为模拟量输入口
ADC_RES=0;                                                                         //单片机AD采集寄存器清零
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START;         //启动AD
Delay10ms();                                                                 
EA=1;                                                    //开中断
SI=0;                                                                                 
CLK=0;                                                                                 
}                                                                                         
void busy()                                                     //检测液晶屏忙状态
{
uchar i=255;                                                                 
P0=0XFF;                                                                        
RS=0;                                        //设置该字节数据为命令代码
RW=1;                                        //设置此次操作为读
E=1;                                         //使能
while((i--)&&(P0&0X80));                                         //等待液晶屏不忙
E=0;                                                                                 
}
void Write12864(uchar Dat,bit command)
{        
    busy();                                                                          
        P0=Dat;                                              //将命令写入总线
        RS=command;                                                                  
        RW=0;                                                                          
        _nop_();                                          //空操作,做短暂的延时
        E=1;                                                     //E的下降沿,数据写入
        _nop_();                                           //空操作,做短暂的延时
        E=0;                                                     //E的下降沿,数据写入
}
void WrGdram12864(uchar x,uchar y,uchar *map,uchar high,uchar wide)
     {
          uchar line,row;                                                      
          Write12864(0x36,0);                                               //液晶屏图形显示方式设置
          if(wide%8==0)                                                               
             wide=wide/8;                                                      
          else wide=wide/8+1;                                               
          for(line=0;line<high;line++)                              
              {                                                                          
                   if(x+line>31)                                               
                      {                                                                       
                           Write12864(0x80+x+line-32,0);       //设置行首地址
                           Write12864(0x80+y+8,0);                       //设置列首地址
                          }
                    else  {
                                   Write12864(0x80+x+line,0);      //设置行首地址
                                   Write12864(0x80+y,0);               //设置列首地址
                              }
                    for(row=0;row<wide;row++)                       
                         Write12864(map[line*wide+row],1);  //写入图像数据   
                  }
     }
void ClrGdram12864()
     {
          uchar line,row;                                                           
          Write12864(0x34,0);                                                     
          for(line=0;line<32;line++)                                   
              {
                   Write12864(0x80+line,0);                                   //写入行首地址
                   Write12864(0x80,0);                                           //写入列首地址
                   for(row=0;row<32;row++)                                   
                       Write12864(0,1);                                           //给图形寄存器写入数据0
                  }         
         }
void init_lcd(void)
{           
        RST=0;              //复位液晶
        delay(1000);        //加些延时
        RST=1;              //复位结束
        delay(1000);        //加些延时
        PSB=1;              //选择8bit并口
        Write12864(0x38,0); //基本指令集
        Delay10ms();              //延时10毫秒
        Write12864(0x01,0); //清除显示(清零DDRAM)
        Delay10ms();            //延时10毫秒
        Write12864(0x0c,0); //显示开
        Delay10ms();                //延时10毫秒
}
void StartIntegration()
{
uchar i=0;                                   
SI=1;                                       
delay(5);                                
CLK=1;                                       
delay(5);                                
SI=0;                                       
delay(5);                                
CLK=0;                                       
for(i=0;i<127;i++)               
    {
         delay(5);                                                  
         CLK=1;                                
         delay(5);                        
         CLK=0;                                
        }
delay(5);                                
CLK=1;                                       
delay(5);                                
CLK=0;                                       
delay(5);                                
}

相关帖子

沙发
luyuan1984|  楼主 | 2014-8-31 21:44 | 只看该作者
void ImageCapture()               
{
uchar i=0;                                
delay(8000);                        
SI=1;                                                                                 
delay(5);                                
CLK=1;                                       
delay(5);                                
SI=0;                                       
delay(5);                                                                                                                                               
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START;               
delay(5);                                                                        
while(!(ADC_CONTR&ADC_FLAG));                                //等待AD转换完成
ADC_CONTR&=~ADC_FLAG;                                                //清AD转换结束标志
Voitage_Value=ADC_RES;                                                //取AD转换高位数据
Voitage_Value=Voitage_Value*4+ADC_RESL;                //取AD转换低位数据
Voltage_Dat[0]=Voitage_Value;                                //将新采集的第一个像素点的电压存入暂存器
CLK=0;                                                                                
for(i=1;i<128;i++)                                                        //采集剩下的127个像素点电压,并存入暂存器
        {                                                                                
         delay(5);                                                                  
         CLK=1;                                                                        
         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START;        
     delay(5);                                                                           
     while(!(ADC_CONTR&ADC_FLAG));                                
         ADC_CONTR&=~ADC_FLAG;                                                
         Voitage_Value=ADC_RES;                                                
     Voitage_Value=Voitage_Value*4+ADC_RESL;         
         Voltage_Dat[i]=Voitage_Value;                                   
         CLK=0;                                                                                
        }                                       
delay(5);                                                                                
CLK=1;                                                                                       
delay(5);                                                                                
CLK=0;                                                                                          
delay(5);                                                                                
}  
///////////////////////////////////////////////////////////
///////////   主函数    ////////////////
//////////////////////////////////////////////////////////
void main()
{
uchar Mov_Cnt=0,OrDat=0,i=0,j=0;
Iint_Parameter();
init_lcd();                                                            //初始化液晶屏
ClrGdram12864();                                                                //清屏
WrGdram12864(0,0,Graph,32,128);                                        //写入上半屏数据
WrGdram12864(32,0,**Cepark,32,128);                        //写入下半屏数据
while(1)
     {
          StartIntegration();                                                 //舍弃TSL14先前的曝光采集数据并重新曝光采集
          ImageCapture();                                                           //间隔一端曝光时间后开始读取像素电压
          for(i=0;i<128;i++)                                                   //电压送液晶屏显示
               {                                                                 
                   Mov_Cnt=i%8;                                                        //计算像素点在哪一列
               OrDat=(0x80>>Mov_Cnt);                                //列赋值1数据暂存
               Mov_Cnt=i/8;                                                        //计算像素点的列地址
           Voitage_Value=Voltage_Dat[i]/32;         //计算像素点电压在竖直方向的长度
           for(j=2;j<32;j++)                                        //给某一列后30个点赋值像素点电压长度
              {                                                                  
                  if(j<=Voitage_Value)                                //小于像素点电压
                        **Cepark[Mov_Cnt+16*j]|=OrDat;//该点赋值1
                         else {
                            **Cepark[Mov_Cnt+16*j]&=(!OrDat);//大于该点赋值0
                               }
                  }
                   }            
           WrGdram12864(32,0,**Cepark,32,128);        //写入新采集的像素电压到液晶屏显示出来
         }                                                                                                   
}

使用特权

评论回复
板凳
luyuan1984|  楼主 | 2014-8-31 21:46 | 只看该作者
         v.youku.com/v_show/id_XNzY0MjUwMzEy.html?firsttime=22.733   

          优酷视频链接(大台阶的困惑)  

使用特权

评论回复
地板
zhangmangui| | 2014-8-31 23:28 | 只看该作者
luyuan1984 发表于 2014-8-31 21:46
v.youku.com/v_show/id_XNzY0MjUwMzEy.html?firsttime=22.733   

          优酷视频链接(大台 ...

什么问题啊

使用特权

评论回复
5
luyuan1984|  楼主 | 2014-9-1 00:24 | 只看该作者
我写的程序是显示128个像素的采集量 32个像素的采集电压 就是说一个运行周期是128次 每次的采集状态用X128显示 采集的电压用Y32显示 现在的状态是 如同视频 后面怎么会有一个八位的台阶。按理说不会有的

使用特权

评论回复
6
luyuan1984|  楼主 | 2014-9-1 00:27 | 只看该作者
咱的语言表达很差 还请版主海涵

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝