[Atmel] 用AtmelStudio6.2跑mega16例程(58)8155扩展

[复制链接]
 楼主| ddllxxrr 发表于 2014-11-25 20:39 | 显示全部楼层 |阅读模式
以下是Proteus仿真截图:


以下是Studio6.2编译通过的截图:


程序清单:

  1. /*
  2. * GccApplication21.c
  3. *
  4. * Created: 2014-11-25 18:20:45
  5. * Author: Administrator
  6. */

  7. #define F_CPU 2000000UL
  8. #include <avr/io.h>
  9. #include <avr/interrupt.h>
  10. #include <util/delay.h>
  11. #include <stdint.h>

  12. #define COMM_8155 (uint8_t*)0xFD00 //命令字端口
  13. #define PA_8155 (uint8_t*)0xFD01 //PA端口地址
  14. #define PB_8155 (uint8_t*)0xFD02
  15. #define PC_8155 (uint8_t*)0xFC00
  16. #define CONT_8155_L8 (uint8_t*)0xFD04
  17. #define CONT_8155_H8 (uint8_t*)0xFD05
  18. #define PMEM_8155 (uint8_t*)0xFC00

  19. #define BEEP() PORTB ^= _BV(PB0)

  20. const uint8_t SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};

  21. uint8_t Disp_Buffer[4] = {10,3,5,0};

  22. volatile uint16_t cnt_8155 = 350;

  23. enum OP_Type{ADD,SUB};

  24. void Sounder()
  25. {
  26. uint8_t i;
  27. for(i = 0; i<50; i++)
  28. {
  29. BEEP();_delay_us(160);
  30. }
  31. }



  32. void Set_8155_TC()
  33. {
  34. *CONT_8155_L8 = (uint8_t)cnt_8155;
  35. *CONT_8155_H8 = (uint8_t)(cnt_8155>>8);
  36. *COMM_8155 = 0B11000011;
  37. }

  38. void adjust_tCount(enum OP_Type op)
  39. {
  40. uint8_t i;
  41. uint16_t cnt;
  42. cnt_8155=(op == ADD)? cnt_8155+50:cnt_8155 - 50;
  43. if(cnt_8155 > 500) cnt_8155 = 500;
  44. else if(cnt_8155 < 100) cnt_8155 = 100;
  45. cnt = cnt_8155;
  46. for(i=3;i>=1;i--)
  47. {
  48. Disp_Buffer[i] = cnt % 10;
  49. cnt /=10;
  50. }

  51. }

  52. void Key_Process()
  53. {

  54. uint8_t i;
  55. static uint8_t Pre_Key_State = 0xFF;
  56. uint8_t curr_Key_State = * PC_8155 | 0xF0;
  57. if(Pre_Key_State == curr_Key_State)return;
  58. Pre_Key_State = curr_Key_State;

  59. switch(curr_Key_State)
  60. {
  61. case (uint8_t)~_BV(0):
  62. adjust_tCount(ADD);
  63. break;
  64. case (uint8_t)~_BV(1):
  65. adjust_tCount(SUB);
  66. break;
  67. case (uint8_t)~_BV(2):
  68. Set_8155_TC();
  69. break;
  70. case (uint8_t)~_BV(3):
  71. for(i=0;i<=100;i++)
  72. {
  73. *(PMEM_8155 +i) = i;
  74. }
  75. break;


  76. }
  77. }


  78. int main(void)
  79. {
  80. uint8_t i;

  81. DDRA = 0xFF;
  82. DDRB = 0xFF;
  83. DDRC = 0xFF;
  84. DDRD = 0x00; PORTD = 0xFF;
  85. MCUCR = 0x82;
  86. *COMM_8155 = 0B00000011;
  87. GICR = _BV(INT0);
  88. sei();
  89. while(1)
  90. {
  91. for(i = 0;i<4;i++)
  92. {
  93. *PB_8155 = 0x00;
  94. *PA_8155 = SEG_CODE[Disp_Buffer[i]];
  95. *PB_8155 = _BV(7-i);
  96. _delay_ms(4);
  97. Key_Process();
  98. }
  99. }
  100. }


  101. ISR(INT0_vect)
  102. {
  103. Sounder();
  104. Set_8155_TC();
  105. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部