Ps2._c
上传用户:rbltsz
上传日期:2007-09-19
资源大小:2509k
文件大小:7k
源码类别:

单片机开发

开发平台:

C/C++

  1. #include <io8535v.h>
  2. #include <macros.h>
  3. #include "Encode.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uchar Row=0;
  7. uchar Column=0;
  8. uchar R_flag=0;//记录当前行列位置及换行标志;
  9. uchar Int_Number;//中断计数器;
  10. uchar Key_Value; //键盘编码值;
  11. uchar Key_Up;    //键盘被释放标志;
  12. uchar Byte_Flag; //键盘编码接收完成标志;
  13. //sbit KEY_CLK=PD^3  
  14. //sbit KEY_DATA=PD^2;//Interrupt
  15. //sbit DI=PB^0;  
  16. void Set_DI(uchar i)
  17. {if(i==1) PORTB=PORTB|0x01;
  18.  else     PORTB=PORTB&0xfe;}
  19.  
  20. //sbit RW=PB^1;
  21. void Set_RW(uchar i)
  22. {if(i==1) PORTB=PORTB|0x02;
  23.  else     PORTB=PORTB&0xfd;}
  24.  
  25. //sbit ENABLE=PB^2;
  26. void Set_EN(uchar i)
  27. {if(i==1) PORTB=PORTB|0x04;
  28.  else     PORTB=PORTB&0xfb;}
  29. //sbit CS1=PB^3;
  30. void Set_CS1(uchar i)
  31. {if(i==1) PORTB=PORTB|0x08;
  32.  else     PORTB=PORTB&0xf7;}
  33. //sbit CS2=PC^6;
  34. void Set_CS2(uchar i)
  35. {if(i==1) PORTC=PORTC|0x40;
  36.  else     PORTC=PORTC&0xbf;}
  37. //sbit RST=PC^7;
  38. void Set_RST(uchar i)
  39. {if(i==1) PORTC=PORTC|0x80;
  40.  else     PORTC=PORTC&0x7f;}
  41. //延时//
  42. void Delay(uint i)
  43. {uint j;
  44.  for(;i!=0;i--) 
  45.   for(j=5000;j!=0;j--) {;}
  46. }
  47. void nop(uchar i)
  48. {for(;i!=0;i--) 
  49.     NOP();
  50. }
  51. // 显示开关控制命令,i=0开显示,i=1关显示//
  52. void DisplayOnOff(uchar i)
  53. {uchar j;
  54.  Set_RW(0);// RW=0;
  55.  Set_DI(0);//DI=0;
  56.  Set_EN(0);//ENABLE=0;
  57.  PORTA=62+i;//P0=0x3e+i;
  58.  nop(10);//_nop_();
  59.  Set_EN(1);//ENABLE=1;
  60.  nop(10);//_nop_();
  61.  nop(10);//_nop_();
  62.  Set_EN(0);//ENABLE=0;
  63. // Delay(1);
  64. }
  65. //设置显示起始行,i=0~63//
  66. void SetStartLine(uchar i)
  67. {Set_RW(0);//RW=0;
  68.  Set_DI(0);//DI=0;
  69.  Set_EN(0);//ENABLE=0;
  70.  PORTA=0xc0+i;//P0=0xc0+i;
  71.  nop(10);//_nop_();
  72.  Set_EN(1);//ENABLE=1;
  73.  nop(10);//_nop_();
  74.  nop(10);//_nop_();
  75.  Set_EN(0);//ENABLE=0;
  76. // Delay(1);
  77. }
  78. //设置页(行)地址,i=0~7//
  79. void SetX(uchar i)
  80. {Set_RW(0);//RW=0;
  81.  Set_DI(0);//DI=0;
  82.  Set_EN(0);//ENABLE=0;
  83.  PORTA=0xb8+i;//P0=0xb8+i;
  84.  nop(10);//_nop_();
  85.  Set_EN(1);//ENABLE=1;
  86.  nop(100);// _nop_();
  87.  nop(100);//_nop_();
  88.  Set_EN(0);//ENABLE=0;
  89. // Delay(1);
  90. }
  91. //设置Y(列)地址,i=0~127//
  92. void SetY(uchar i)
  93. {Set_RW(0);//RW=0;
  94.  Set_DI(0);//DI=0;
  95.  Set_EN(0);//ENABLE=0;
  96.  PORTA=0x40+i;// P0=0x40+i;
  97.  nop(10);//_nop_();
  98.  Set_EN(1);//ENABLE=1;
  99.  nop(10);//_nop_();
  100.  nop(10);// _nop_();
  101.  Set_EN(0);//ENABLE=0;
  102.  //Delay(1);
  103. }
  104. //读状态//
  105. //返回值:DB7,DB6,DB5,DB4,DB3,DB2,DB1,DB0
  106. //返回值:BF,0,ON/OFF,RST,0,0,0,0
  107. /*ucharReadStatus(void)
  108. {uchardata i;
  109.  RW=1;
  110.  DI=0;
  111.  ENABLE=1;
  112.  i=P0;
  113.  return i;
  114. }*/
  115. //写显示数据,i为送DDRAM的数据
  116. void WriteByte(uchar i)
  117. {Set_RW(0);//RW=0;
  118.  Set_DI(1);//DI=1;
  119.  Set_EN(0);//ENABLE=0;
  120.  PORTA=i;//P0=i;
  121.  nop(10);//_nop_();
  122.  Set_EN(1);//ENABLE=1;
  123.  nop(10);//_nop_();
  124.  nop(10);//_nop_();
  125.  Set_EN(0);//ENABLE=0;
  126.  //Delay(1);
  127. }
  128. //读显示数据处理
  129. /*ucharReadData(void)
  130. {uchar i;
  131.  RW=1;
  132.  DI=0;
  133.  ENABLE=1;
  134.  i=P0;
  135.  return i;
  136. }*/
  137. //LCD复位//
  138. void Reset(void)
  139. {Set_RST(0);//RST=0;
  140.  Delay(1);
  141.  Set_RST(1);//RST=1;
  142.  //Delay(1);
  143. }
  144. void ClearScreen(uchar k)
  145. {uchar i,j;
  146.  Set_CS1(1);//CS1=1;
  147.  Set_CS2(1);//CS2=1;
  148.  for(i=k;i<8;i+=1)
  149.   {SetX(i);
  150.  for(j=0;j<64;j++)
  151. WriteByte(0x00);
  152.  }
  153. }
  154.  
  155. //LCD初始化//
  156. void InitLCD(void)
  157. {Reset();
  158.  Delay(0);
  159.  ClearScreen(0);
  160.  DisplayOnOff(1);
  161.  SetStartLine(0);
  162.  }
  163. void WriteWord(uchar const *disp,uchar x,uchar y,uchar cs)
  164. {uchar i;
  165.  if(cs==1) {Set_CS1(1);Set_CS2(0);}
  166.  else      {Set_CS1(0);Set_CS2(1);}
  167.  SetX(x);
  168.  SetY(y);
  169.  for(i=0;i<16;i++)
  170.      {WriteByte(*disp);
  171.    disp++;}
  172.   SetX(x+1);
  173.   SetY(y);
  174.   for(i=0;i<16;i++)
  175.   {WriteByte(*disp);
  176.  disp++;}
  177. }
  178. void WriteCharacter(const uchar *disp,uchar x,uchar y,uchar cs)
  179. {uchar i;
  180.  if(cs==0) {Set_CS1(1);Set_CS2(0);}//CS1=1选中右屏幕;
  181.  else      {Set_CS1(0);Set_CS2(1);}//CS2=1选中左屏幕;
  182.  SetX(x);
  183.  SetY(y);
  184.  for(i=0;i<8;i++)
  185.      {WriteByte(*disp);
  186.    disp++;}
  187.   SetX(x+1);
  188.   SetY(y);
  189.   for(i=0;i<8;i++)
  190.   {WriteByte(*disp);
  191.  disp++;}
  192. }
  193. void Write_Character(uchar i)
  194. {uchar shift1;
  195.  uchar const *p;
  196.  switch(i)
  197.   {case 0:p=X0;break;
  198.    case 1:p=X1;break;
  199.    case 2:p=X2;break;
  200.    case 3:p=X3;break;
  201.    case 4:p=X4;break;
  202.    case 5:p=X5;break;
  203.    case 6:p=X6;break;
  204.    case 7:p=X7;break;
  205.    case 8:p=X8;break;
  206.    default:p=X9;break;}   
  207.  
  208.  if(R_flag==1) //若是写右边的屏幕; 
  209.   {if(Column==56) 
  210.    {shift1=1;//若是到了最后一个字节,则写完后要换行
  211.         WriteCharacter(p,Row,Column,!R_flag);
  212. R_flag=0;//回到左边屏幕第0列;
  213. Column=0;
  214. if(shift1==1) 
  215. {Row+=2;shift1=0;}
  216. if (Row>7) Row=0;
  217. }
  218.   else 
  219.    {WriteCharacter(p,Row,Column,!R_flag);
  220.         Column=Column+8;} 
  221.  }
  222.  else
  223.    {if(Column==56) //写完后需要换右边的屏幕