原创 ATmega16_App_V1.0开发板范例3:MAX7219驱动8位共阴数码管实验

2009-11-5 17:31 4190 9 10 分类: MCU/ 嵌入式
一、程序结构
attachimg.gif 程序结构

二、仿真效果
attachimg.gif 点击看大图

三、程序源码
main.c



  1. /*******************************************************************************

  2. Platform: ATmega16_App_V1.0开发板(http://bbs.armavr.com)

  3. Project : 范例3:MAX7219驱动8位共阴数码管实验

  4. Clock F : 内部8M

  5. Software: ICCAVR7.14C+proteus7.5

  6. Author : 林夕依然

  7. BBS : http://bbs.armavr.com

  8. Version : 09.11.03

  9. Updata :

  10. comments:

  11. 1、使用内部8MHz晶体;

  12. 2、硬件连接详见proteus仿真模型;

  13. 3、M16的C0/C1/C2控制MAX7219显示,使用第三种算法;

  14. 4、8位共阴数码管间隔1S交替显示日期和生日信息;

  15. 5、参考:www.avrvi.com/qinlinzhu/我做的第一个C语言程序-MAX7219显示.

  16. *******************************************************************************/

  17. #include <iom16v.h>

  18. #include <macros.h>



  19. #define uchar unsigned char

  20. #define uint unsigned int



  21. //全局变量定义

  22. uint TEN,QIAN,BAI,SHI,GE;



  23. //函数声明

  24. void delay_us(uint n);

  25. void delay_ms(uint i);

  26. void port_init(void);

  27. void init_max7219(void);

  28. void conver16_to10(uint num);

  29. void send_max7219(uchar add,uchar dat);

  30. void display_date(void);

  31. void display_birthday(void);



  32. /*-----------------------------------------------------------------

  33. 函数名称: void delay_us(uint n),void delay_ms(uint i)

  34. 函数功能: us,ms延时函数

  35. 参 数: n,i

  36. 返 回 值: 无

  37. -----------------------------------------------------------------*/

  38. //us延时函数

  39. void delay_us(uint n) //8*0.125=1us

  40. {

  41. int i,j;

  42. for(j=0;j<8;j++)

  43. {

  44. for (i=0;i<n;i++)

  45. NOP();

  46. }

  47. }



  48. //ms延时函数

  49. void delay_ms(uint i)

  50. {

  51. while(i--)

  52. {

  53. uint j;

  54. for(j=1;j<=1332;j++)

  55. ;

  56. }

  57. }



  58. /*-----------------------------------------------------------------

  59. 函数名称: void conver16_to10(uint num)

  60. 函数功能: 16进制转10进制函数

  61. 参 数: num

  62. 返 回 值: 无

  63. -----------------------------------------------------------------*/

  64. void conver16_to10(uint num)

  65. {

  66. TEN=num;

  67. QIAN=TEN/0x03e8;

  68. TEN%=0x03e8;

  69. BAI=TEN/0x64;

  70. TEN%=0x64;

  71. SHI=TEN/0x0a;

  72. TEN%=0x0a;

  73. GE=TEN;

  74. }



  75. /*-----------------------------------------------------------------

  76. 函数名称: void init_max7219(void)

  77. 函数功能: MAX7219初始化函数

  78. 参 数: 无

  79. 返 回 值: 无

  80. -----------------------------------------------------------------*/

  81. void init_max7219(void)

  82. {

  83. send_max7219(0x0c,0x01);//关断方式:正常操作=1/睡眠模式=0;

  84. send_max7219(0x0f,0x00);//显示测试:正常=0/测试模式=1;现为正常模式;

  85. send_max7219(0x09,0xff);//译码方式:不译码=0/BCD译码=1;

  86. send_max7219(0x0b,0x07);//扫描限制:范围0~8位,设置为8位;

  87. send_max7219(0x0a,0x07);//显示亮度:范围0~F,现设置为7;

  88. delay_ms(10);

  89. }



  90. /*-----------------------------------------------------------------

  91. 函数名称: void send_max7219(uchar add,uchar data)

  92. 函数功能: MAX7219寄存器操作函数

  93. 参 数: add:地址,data:数据

  94. 返 回 值: 无

  95. -----------------------------------------------------------------*/

  96. void send_max7219(uchar add,uchar data)

  97. {

  98. uchar ADS,i,j;

  99. PORTC&=0xF7; //LOAD=0,PC3=0

  100. while(i<16)

  101. {

  102. if(i<8){ADS=add;}

  103. else{ADS=data;}

  104. for(j=0;j<8;j++)

  105. {

  106. PORTC&=0xEF; //CLOCK=0,PC4=0

  107. if((ADS&0x80)==0x80)

  108. PORTC|=0x04; //DIN=1,PC2=1

  109. else

  110. PORTC&=0xFB; //DIN=0,PC2=0

  111. PORTC|=0x10; //CLOCK=1,PC4=1

  112. ADS=ADS<<1;

  113. }

  114. i=i+8;

  115. }

  116. PORTC|=0x08; //LOAD=1,PC3=1

  117. }



  118. /*-----------------------------------------------------------------

  119. 函数名称: void display_date(void)

  120. 函数功能: 日期显示函数

  121. 参 数: 无

  122. 返 回 值: 无

  123. 说 明:本次开发板两只数码管位置搞反,改版时调换,本次使用程序处理

  124. -----------------------------------------------------------------*/

  125. void display_date(void)

  126. {

  127. conver16_to10(2009);

  128. send_max7219(0x05,QIAN); //5

  129. send_max7219(0x06,BAI); //6

  130. send_max7219(0x07,SHI); //7

  131. send_max7219(0x08,0x80|GE);//8,显示小数点

  132. send_max7219(0x01,1); //1

  133. send_max7219(0x02,0x80|1); //2,显示小数点

  134. send_max7219(0x03,0); //3

  135. send_max7219(0x04,3); //4

  136. }



  137. /*-----------------------------------------------------------------

  138. 函数名称: void display_birthday(void)

  139. 函数功能: 论坛生日显示函数

  140. 参 数: 无

  141. 返 回 值: 无

  142. 说 明:本次开发板两只数码管位置搞反,改版时调换,本次使用程序处理

  143. -----------------------------------------------------------------*/

  144. void display_birthday(void)

  145. {

  146. conver16_to10(2009);

  147. send_max7219(0x05,QIAN); //5

  148. send_max7219(0x06,BAI); //6

  149. send_max7219(0x07,SHI); //7

  150. send_max7219(0x08,0x80|GE);//8,显示小数点

  151. send_max7219(0x01,0); //1

  152. send_max7219(0x02,0x80|3); //2,显示小数点

  153. send_max7219(0x03,2); //3

  154. send_max7219(0x04,7); //4

  155. }

  156. /*-----------------------------------------------------------------

  157. 函数名称: void port_init(void)

  158. 函数功能: 端口初始化函数

  159. 参 数: 无

  160. 返 回 值: 无

  161. -----------------------------------------------------------------*/

  162. void port_init(void)

  163. {

  164. PORTA=0xFF;

  165. DDRA=0x00;

  166. PORTB=0xFF;

  167. DDRB=0x00;

  168. PORTC=0x00;

  169. DDRC=0xFF;

  170. PORTD=0xFF;

  171. DDRD=0x00;

  172. }



  173. /*-----------------------------------------------------------------

  174. 函数名称: void main(void)

  175. 函数功能: 主函数

  176. 参 数: 无

  177. 返 回 值: 无

  178. -----------------------------------------------------------------*/

  179. void main(void)

  180. {

  181. delay_ms(200); //延时,待上电稳定

  182. port_init(); //端口初始化

  183. init_max7219(); //max7219初始化

  184. while (1)

  185. {

  186. display_date(); //显示日期

  187. delay_ms(1000);

  188. display_birthday(); //显示生日

  189. delay_ms(1000);

  190. }

  191. }

四、完整项目文件


https://static.assets-stash.eet-china.com/album/old-resources/2009/11/5/e4a66aae-68c9-4b13-9c72-3ba5a8449259.rar

文章评论1条评论)

登录后参与讨论

用户1294761 2011-1-20 10:08

我来学习一下。。

用户183207 2007-4-28 20:28

沃尔特
相关推荐阅读
用户1400544 2012-09-24 08:55
【分享】ATmega16学习笔记PDF完整版下载(WinAVR)
  笔记均为原创,欢迎转载,转载请注明出处!   笔记1:8种LED点亮模式_GCC.pdf 笔记2:有源蜂鸣器驱动实验_GCC.pdf 笔记3:按键扫描(用KEY选择对应LED...
用户1400544 2011-01-19 23:26
博主邀请您:加入千脑,拥有“我的在线电脑”
点击加入千脑,拥有“我的在线电脑”在线电脑随时随地可用,安全可靠您可能遇到以下情况: 用户场景一:        我是一个集团公司的企业白领,经常负责写些策划书,制作各类表格等,有时候上班时间做不完就...
用户1400544 2010-04-07 00:43
ATmega16_Basic_V1.1范例2:8种LED点亮模式(ICC)
一、程序结构二、程序源码1、main.c /******************************************************************************...
用户1400544 2010-04-07 00:22
ATmega16_Basic_V1.1范例1:LED流水灯(ICC)
一、程序结构二、程序源码1、main.c /******************************************************************************...
用户1400544 2010-03-30 14:39
Altium Designer 6原理图元件库大全(7个种类)
》》点此进入      http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛       ARM-AVR嵌入式开发论坛推出【Altium Designer 6 原理图元件库大...
用户1400544 2010-03-30 14:39
protel99原理图元件库大全(8个种类)
》》点此进入      http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛       ARM-AVR嵌入式开发论坛推出【protel99原理图元件库大全(8个种类)】,共...
我要评论
1
9
关闭 站长推荐上一条 /2 下一条