1. #include <STC15F2K60S2.H> 2. #include <intrins.h> 3. 4. /*7段数码段对应的8Bit顺序依次为bit7~bit0:abcx_fged 5. --01-- 6. | | 7. 10 02 08 8. | --20-- | 9. 40 04 08 10. | | 11. --80-- 12. */ 13. 14. /*-------------------------------------------------------------- 15. LCD操作相关的宏定义和函数声明 16. ----------------------------------------------------------------*/ 17. #define ComMode 0x52 //4COM,1/3bias 偏压比 1000 0101 0010 18. //#define ComMode 0x50 //4COM,1/2bias 1000 0101 0000 19. #define RCosc 0x30 //内部RC振荡器(上电默认)1000 0011 0000 20. #define LCD_on 0x06 //打开LCD显示 偏压发生器1000 0000 0110 21. #define LCD_off 0x04 //关闭LCD显示(上电默认) 22. #define Sys_en 0x02 //系统振荡器开 1000 0000 0010 23. #define Ctrl_cmd 0x80 //写控制命令 1000 24. #define Data_cmd 0xa0 //写数据命令 1010 25. 26. sbit DIPIN =P3^7; //LCD液晶屏DI引脚 27. sbit CLKPIN =P3^6; //LCD液晶屏CLK引脚 28. sbit CSPIN =P3^5; //LCD液晶屏CS引脚 29. 30. //SMS0707B LCD Drive code 31. //Write bit data 写位数据 32. void SendBit_1621(unsigned char sdata,unsigned char cnt) 33. //sdata 的高cnt 位写入HT1621,高位在前 34. { 35. unsigned char i; 36. for(i=0;i<cnt;i++) 37. { 38. CLKPIN=0; 39. if(sdata&0x80) 40. DIPIN=1; 41. else DIPIN=0; 42. CLKPIN=1; 43. sdata<<=1; 44. } 45. } 46. 47. /*-------------------------------------------------------------------------------------------------------- 48. Name: SendCmd(送命令) 49. 写入标志码"100"和9位comma命令,由于没有使用到更改时钟输出等命令 50. 为了编程方便直接将command 的最高位写"0" 51. ----------------------------------------------------------------------------------------------------------*/ 52. void SendCmd_1621(unsigned char command)//写命令 53. { //3位标志码 + 9位命令,共12位 54. CSPIN=0; //执行一个下降沿 55. SendBit_1621(0x80,4); 56. //写入标志码"100"和9位comma命令的最高1位共4位 57. SendBit_1621(command,8); 58. //写入9位comma命令的后8位,组成1000 xxxx xxxx 59. CSPIN=1; //送数完成后置高电平 60. } 61. 62. /******------------------------------------------------------------------------- 63. Name: Write_1621(送命令和数据程序) 64. 写入标志码"101"和6位addr地址码和8位sdata显示数据。 65. ---------------------------------------------------------------------------*******/ 66. void Write_1621(unsigned char addr,unsigned char sdata,unsigned char len)//写数据 67. {//3位标志码 + 6位写数据命令 + 8(4)位数据,共17位 68. addr<<=2;//高6位有效 69. CSPIN=0; //执行一个下降沿 70. SendBit_1621(0xa0,3); //写入标志码"101" 写数据命令101 71. SendBit_1621(addr,6); //写入addr 的高6位 写数据命令xxxx xx 72. SendBit_1621(sdata,len); //写入8/4位 sdata数据 len=8/4 73. CSPIN=1;//送数完成后置高电平 74. } 75. 76. /**------------------------------------------------------------------------- 77. Name: Init_1621(初始化1621) 78. -------------------------------------------------------------------------******/ 79. void LCD_Init() //初始化 80. { //程序输入100 0+8=9位命令 81. SendCmd_1621(Sys_en); //Sys_en 0x02 系统振荡器开 100 0 0000 0010 82. SendCmd_1621(RCosc); 83. //RCosc 0x30 内部RC振荡器(上电默认) 100 0 0011 0000 84. SendCmd_1621(ComMode); //4COM,1/3bias 100 0 0101 0020 85. SendCmd_1621(LCD_on); 86. //LCD_on 0x06 打开LCD显示 偏压发生器100 0 0000 0110 87. } 88. 89. /*------------------------------------------------------------------------- 90. Name: lcdwd1(点亮1621全部Seg) 91. -------------------------------------------------------------------------*/ 92. void LCDWD1(void) 93. { 94. unsigned char i; 95. unsigned char addr=9;//5位显示码寄存器起始地址0x09 96. for(i=0;i<5;i++) 97. { 98. Write_1621(addr,LCD_Buffer[i+1],8); 99. //addr为地址码,l_data为数据,8为8位数据 100. addr+=2; //顺延2个4位地址码 101. } 102. } |
很高兴你能分享和详细说明1621原理,一直不懂怎么下手编程。 |
先看看,应该用的着 |
没有设计代码 |
就需要在COM1-SEG1和SEG2,COM2-SEG1和SEG2, COM3-SEG1和SEG2, COM4-SEG1和SEG2,之间同时施加交流电压 SEG1-COM2、SEG1-COM3 |
网上有现成的代码,移值过来就行了吧。有时不必什么都懂。有时我们是做产品,不是搞科研,当教授。 |
请问楼主现在还接51内核的方案吗 |
这个地址到底是怎么看的 |
除了两处对应不上,讲得算是比较清楚的了 |
先看看,后面应该用的着 |
先顶起!应该是很好的资料 |
蛮详细的 感谢分享 |
1元感谢楼主![]() ![]() |
正在研究1621,楼主讲得简单易懂,学习了。 |
不错不错! |
很好的资料,先收藏了 |
图6和图7之间那段话应该是COM1-SEG1和COM2-SEG1z,这样才能和图7对应起来,否则会让人产生误解 |
楼主上面关于点亮第一个“8”的段码有问题 按照图片的显示应该是COM0-SEG1,COM1-SEG0和SEG1, COM2-SEG0和SEG1, COM3-SEG0和SEG1,即1A 1B 1C 1D 1E 1F 1G7个笔段。 |