AIP1629A-timedisplay.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /**************************************************************
  2. * 数码管时钟显示程序:
  3. * 1. 宏定义SPI_CS为SPI片选引脚,根据需要修改gpio143的数字即可
  4. * 2. cmd_dis_mode变量为数码管亮度设置变量,取值为0x88--0x8F
  5. **************************************************************/
  6. #include <sys/poll.h>
  7. #include <signal.h>
  8. #include <sys/time.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <errno.h>
  13. #include <time.h>
  14. #include <sys/types.h>
  15. #include <unistd.h>
  16. #include <fcntl.h>
  17. #include <linux/spi/spidev.h>
  18. #include <sys/ioctl.h>
  19. #include "iniparser.h"
  20. #define TRUE 1
  21. #define FALSE 0
  22. #define SPI_CS "/sys/class/gpio/gpio143/value"
  23. #define SPK_CONF "/etc/speaker.conf"
  24. #define _DATETIME_SIZE 32
  25. const unsigned char BCD_LABLE_ALL[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
  26. 0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
  27. unsigned char BCD_LABLE_anode[16] = {0};
  28. unsigned char cmd_dis_mode = 0x8B; /* 数码管亮度设置,最小0x88, 最大0x8F */
  29. int fd;
  30. static int is24Hour = TRUE;
  31. int send_8bit(unsigned char data)
  32. {
  33. unsigned char tmp[1]={0};
  34. data=(data<<4) | (data>>4);
  35. data=((data<<2)&0xcc) | ((data>>2)&0x33);
  36. data=((data<<1)&0xaa) | ((data>>1)&0x55);
  37. tmp[0] = data;
  38. write(fd, tmp, 1);
  39. return 0;
  40. }
  41. void send_command(unsigned char data)
  42. {
  43. system("echo 1 > " SPI_CS);
  44. usleep(1);
  45. system("echo 0 > " SPI_CS);
  46. send_8bit(data);
  47. }
  48. void Write_String(unsigned char *p,unsigned char cnt)
  49. {
  50. unsigned char i;
  51. for(i=0; i<cnt; i++){
  52. send_8bit(*p++);
  53. }
  54. }
  55. void NE_C(unsigned char ydata,unsigned char cnt)
  56. {
  57. char i=0,j=0;
  58. if(cnt>0){
  59. if(cnt>8){
  60. cnt = cnt - 9;
  61. for(i=1;i<16;i=i+2)
  62. {
  63. if(ydata&0x01 == 0x01)
  64. {
  65. BCD_LABLE_anode[i] |= (0x01<<cnt);
  66. }
  67. else
  68. {
  69. BCD_LABLE_anode[i] &= ~(0x01<<cnt);
  70. }
  71. ydata = (ydata>>1);
  72. }
  73. }else {
  74. cnt = cnt -1;
  75. for(i=0;i<16;i=i+2)
  76. {
  77. if((ydata&0x01) == 0x01){
  78. BCD_LABLE_anode[i] |= (0x01<<cnt);
  79. }
  80. else{
  81. BCD_LABLE_anode[i] &= ~(0x01<<cnt);
  82. }
  83. ydata = (ydata>>1);
  84. }
  85. }
  86. }
  87. }
  88. int is24HourClock()
  89. {
  90. dictionary * ini ;
  91. ini = iniparser_load(SPK_CONF);
  92. char is24hourclock[8];
  93. if (ini==NULL) {
  94. fprintf(stderr, "cannot parse file: %s\n", SPK_CONF);
  95. return FALSE ;
  96. }
  97. strcpy(is24hourclock, iniparser_getstring(ini, "system:is24hourclock", "yes"));
  98. iniparser_freedict(ini);
  99. if(strcmp(is24hourclock,"yes") == 0)
  100. {
  101. return TRUE;
  102. }
  103. else
  104. {
  105. return FALSE;
  106. }
  107. }
  108. void display(unsigned char number,unsigned char cnt1)
  109. {
  110. NE_C(BCD_LABLE_ALL[number],cnt1);
  111. send_command(0x40);
  112. send_command(0xc0);
  113. Write_String(BCD_LABLE_anode,16);
  114. send_command(cmd_dis_mode);
  115. system("echo 1 > " SPI_CS);
  116. }
  117. void display_fixedadd(unsigned char number, unsigned char cnt1, unsigned char addr)
  118. {
  119. NE_C(BCD_LABLE_ALL[number],cnt1);
  120. send_command(0x44);
  121. send_command(addr);
  122. send_8bit(BCD_LABLE_anode[number]);
  123. send_command(cmd_dis_mode);
  124. system("echo 1 > " SPI_CS);
  125. }
  126. int gettime(char *psTime)
  127. {
  128. time_t nSeconds;
  129. struct tm *pTM;
  130. int tmp_hour;
  131. time(&nSeconds); //same with nSeconds = time(NULL);
  132. pTM = localtime(&nSeconds);
  133. if(is24Hour)
  134. {
  135. tmp_hour = pTM->tm_hour;
  136. }
  137. else
  138. {
  139. tmp_hour = pTM->tm_hour%12;
  140. if(tmp_hour == 0) tmp_hour = 12;
  141. }
  142. sprintf(psTime, "%02d:%02d:%02d", tmp_hour, pTM->tm_min, pTM->tm_sec);
  143. return 0;
  144. }
  145. int main(int argc, char *argv[]){
  146. int ret,i;
  147. char DateTime[_DATETIME_SIZE];
  148. char Old_Clock[5];
  149. unsigned int speed=8000;
  150. unsigned char spi_mode=0;
  151. char dot_flash=0;
  152. //printf("+----------hello world-----------+\n");
  153. fd = open("/dev/spidev0.0", O_RDWR);
  154. if(fd < 0){
  155. printf("open spidev error!!\n");
  156. return fd;
  157. }
  158. ret = ioctl(fd, SPI_IOC_WR_MODE, &spi_mode);
  159. ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
  160. is24Hour = is24HourClock();
  161. memset(DateTime, 0, sizeof(DateTime));
  162. memset(Old_Clock, 0, sizeof(Old_Clock));
  163. ret = gettime(DateTime);
  164. if(DateTime[0] - 0x30 == 0)
  165. display(10,1);
  166. else
  167. display(DateTime[0]-0x30, 1);
  168. display(DateTime[1]-0x30, 2);
  169. display(DateTime[3]-0x30, 3);
  170. display(DateTime[4]-0x30, 4);
  171. for(i=0; i<5; i++)
  172. Old_Clock[i] = DateTime[i]-0x30;
  173. while(1){
  174. ret = gettime(DateTime);
  175. if(Old_Clock[0] != (DateTime[0]-0x30)){
  176. Old_Clock[0] = DateTime[0]-0x30;
  177. if(Old_Clock[0] == 0)
  178. display(10, 1);
  179. else
  180. display(Old_Clock[0], 1);
  181. }
  182. if(Old_Clock[1] != (DateTime[1]-0x30)){
  183. Old_Clock[1] = DateTime[1]-0x30;
  184. display(Old_Clock[1], 2);
  185. }
  186. if(Old_Clock[3] != (DateTime[3]-0x30)){
  187. Old_Clock[3] = DateTime[3]-0x30;
  188. display(Old_Clock[3], 3);
  189. }
  190. if(Old_Clock[4] != (DateTime[4]-0x30)){
  191. Old_Clock[4] = DateTime[4]-0x30;
  192. display(Old_Clock[4], 4);
  193. }
  194. sleep(1);
  195. if(!dot_flash){
  196. display(18, 5);
  197. //display(18, 6);
  198. dot_flash = 1;
  199. }else{
  200. display(0, 5);
  201. //display(0, 6);
  202. dot_flash = 0;
  203. }
  204. }
  205. close(fd);
  206. return 0;
  207. }