标题: LCD PG160128A液晶屏仿真与单片机源程序 [打印本页]

作者: 谢绿林    时间: 2017-12-4 12:59
标题: LCD PG160128A液晶屏仿真与单片机源程序
PG160128A仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include  "config.h"
  2. /****************************************************************************
  3. * 名称:DelayNS()
  4. * 功能:长软件延时
  5. * 入口参数:dly                延时参数,值越大,延时越久
  6. * 出口参数:无
  7. ****************************************************************************/
  8. /*void  delay(uint32  dly)
  9. {  uint32  i;

  10.    for(; dly>0; dly--)
  11.       for(i=0; i<500; i++);
  12. }*/

  13. __inline void enable_irq()
  14.         {
  15.         uint8 tmp;
  16.         __asm
  17.                 {
  18.                 MRS tmp,CPSR
  19.                 BIC tmp,tmp,#0x80
  20.                 MSR CPSR_c,tmp
  21.                 }
  22.         }

  23. __inline void disable_irq()
  24.         {
  25.         uint8 tmp;
  26.         __asm
  27.                 {
  28.                 MRS tmp,CPSR
  29.                 ORR tmp,tmp,#0x80
  30.                 MSR CPSR_c,tmp
  31.                 }
  32.         }

  33. __inline void enable_frq()
  34.         {
  35.         uint8 tmp;
  36.         __asm
  37.                 {
  38.                 MRS tmp,CPSR
  39.                 BIC tmp,tmp,#0x40
  40.                 MSR CPSR_c,tmp
  41.                 }
  42.         }

  43. __inline void disable_frq()
  44.         {
  45.         uint8 tmp;
  46.         __asm
  47.                 {
  48.                 MRS tmp,CPSR
  49.                 ORR tmp,tmp,#0x40
  50.                 MSR CPSR_c,tmp
  51.                 }
  52.         }

  53. //**************lcd programme start*****************************
  54. #define wr (1<<8)
  55. #define rd (1<<9)
  56. #define cd (1<<10)


  57. void delay(int c)
  58.         {
  59.         int j;
  60.         while(c--)
  61.                 for(j=500;j>0;j--)
  62.                         ;
  63.         }

  64. uint8 rd_state()        //读状态
  65.         {
  66.         uint8 temp;
  67.         IODIR=0x700;
  68.         IOSET=cd;
  69.         IOCLR=rd;
  70.         temp=IOPIN;
  71.         IOSET=rd;
  72.         return(temp);
  73.         }

  74. void rd_enable()        //等待可读写
  75.         {
  76.         uint8 temp;
  77.         temp=rd_state();
  78.         while((temp&0x03)!=0x03)
  79.                 temp=rd_state();
  80.         }

  81. void rd_auto()        //等待自动读写
  82.         {
  83.         uint8 temp;
  84.         temp=rd_state();
  85.         while((temp&0x04)!=0x04)
  86.                 temp=rd_state();
  87.         }

  88. void wr_auto()        //等待自动写
  89.         {
  90.         uint8 temp;
  91.         temp=rd_state();
  92.         while((temp&0x08)!=0x08)
  93.                 temp=rd_state();
  94.         }

  95. /*写命令、写数据命令*********************
  96. 数据1、数据2、命令、参数个数*************
  97. *****************************************/
  98. void wr_data(char data1,char data2,char cmd,char num)
  99.         {
  100.         char temp;
  101.         temp=num;
  102.         if(temp==2)
  103.                 {
  104.                 rd_enable();
  105.                 IODIR=0x7ff;
  106.                 IOCLR=cd;
  107.                 IOCLR=0xff;
  108.                 IOSET=data1;
  109.                 IOCLR=wr;
  110.                 IOSET=wr;
  111.                 }
  112.          if(temp==2||temp==1)
  113.                  {
  114.                 rd_enable();
  115.                 IODIR=0x7ff;
  116.                 IOCLR=cd;
  117.                 IOCLR=0xff;
  118.                 IOSET=data2;
  119.                 IOCLR=wr;
  120.                 IOSET=wr;
  121.                 }
  122.         rd_enable();
  123.         IODIR=0x7ff;
  124.         IOSET=cd;
  125.         IOCLR=0xff;
  126.         IOSET=cmd;
  127.         IOCLR=wr;
  128.         IOSET=wr;
  129.         }

  130. char rd_data()        //读数据
  131.         {
  132.         char temp;
  133.         rd_enable();
  134.         IODIR=0x700;
  135.         IOCLR=cd;
  136.         IOCLR=rd;
  137.         temp=IOPIN;
  138.         IOSET=rd;
  139.         return(temp);
  140.         }



  141. void lcd_init()
  142.         {
  143.         IODIR=cd|rd|wr;
  144.         IOSET=cd|rd|wr;
  145.         wr_data(0x00,0x00,0x40,0x02);        //设置文本显示首地址
  146.         wr_data(0x14,0x00,0x41,0x02);        //设置文本显示宽度
  147.         wr_data(0x40,0x01,0x42,0x02);        //设置图形显示首地址
  148.         wr_data(0x14,0x00,0x43,0x02);        //设置图形显示宽度
  149.         wr_data(0x00,0x00,0xa1,0x00);        //光标形状设置
  150.         wr_data(0x00,0x00,0x80,0x00);        //显示方式设置,“或”
  151.         wr_data(0x00,0x00,0x9c,0x00);        //显示开关设置
  152.         }
  153. //******************lcd programme end*******************************


  154. /****************************************************************************
  155. ……………………

  156. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
2104控制的点阵lcd.rar (64.71 KB, 下载次数: 90)







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1