求有会atmega16单片机程序编程的吗?我的程序编程不全能否帮忙补全,,,谢谢
#include <avr/io.h>#include "common.h"#include "key.h"// 测试主程序,系统主时钟为外部11059200Hzint main(void){ //OSCCAL = 0x9d; // 8M系统内部时钟校准 // 配置IO管脚DDRA |= LED1 | LED2 | LED3 | LED4;PORTA = LED1 | LED2 | LED3 | LED4;key_init(); // 键盘初始化 while(1) {// 键盘扫描key_scan();if (key_pressed != 0) {key_pressed = 0;key_proc();} }return 0;#include <avr/io.h>#include "key.h"u8_t key_pressed;u8_t key_val;void key_init(void){key_pressed = 0;key_val = 0;}// 扫描键盘void key_scan(void){// 判断是否有键按下if (((PINC & 0xc2) != 0xc2) || ((PIND & 0x80) != 0x80)) {delay_nms(20); // 去抖动if (((PINC & 0xc2) != 0xc2) || ((PIND & 0x80) != 0x80)) {key_pressed = 1;if ((PINC & KEY2) == 0) {key_val = 2;while ((PINC & KEY2) == 0) ; // 等待按键释放return;}if ((PINC & KEY3) == 0) {key_val = 3;while ((PINC & KEY3) == 0) ; // 等待按键释放return;}if ((PINC & KEY4) == 0) {key_val = 4;while ((PINC & KEY4) == 0) ; // 等待按键释放return;}if ((PIND & KEY1) == 0) {key_val = 1;while ((PIND & KEY1) == 0) ; // 等待按键释放return;}}}}// 处理键值void key_proc(void){switch (key_val) {case 1:PORTA &= ~LED1;delay_nms(300);PORTA |= LED1;break;case 2:PORTA &= ~LED2;delay_nms(300);PORTA |= LED2;break;case 3:PORTA &= ~LED3;delay_nms(300);PORTA |= LED3;break;case 4:PORTA &= ~LED4;delay_nms(300);PORTA |= LED4;break;default:break;}}#include "common.h"/*-----------------------------------------------------------------------延时函数系统时钟:8M-----------------------------------------------------------------------*/void delay_1us(void) //1us延时函数 { asm("nop"::); }void delay_nus(unsigned int n) //N us延时函数 { unsigned int i=0; for (i=0;i<n;i++) delay_1us(); }void delay_1ms(void) //1ms延时函数 { unsigned int i; for (i=0;i<1140;i++) asm("nop"::); }void delay_nms(unsigned int n) //N ms延时函数 { unsigned int i=0; for (i=0;i<n;i++) delay_1ms(); }