完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如果你和我一样正在学习 微机原理。希望我写的东西对你有帮助。
实现的功能:#include #include #define DAC0832 XBYTE[0XF7FF] #define uint unsigned int #define uchar unsigned char unsigned char i, dat, flag = 1; uint j = 0; uchar line, row, kvalue, kscan; // 延时消抖函数 // void delay() //T0 // { // TMOD = 0X01; // TH0 = (65536 - 20000) / 256; // TL0 = (65536 - 20000) % 256; // TR0 = 1; // do // { // /* code */ // } while (!TF0); // TF0 = 0; // } void delay1ms(uint n) //粗略延时n ms { uint m, h, k; for (k = n; k > 0; k--) for (m = 195; m > 0; m--) for (h = 4; h > 0; h--) ; } /*矩阵按键函数*/ // 键盘扫描法 uchar keyScanning() { P1 = 0xf0; row = P1; if (row != 0xf0) { delay1ms(20); /* 粗扫描 */ row = P1; if (row != 0xff) { /*按键确实被按下,开始细扫描*/ line = 1; P1 = ~line; row = P1 & 0xf0; do { /* code */ if (row == 0xf0) { /*逐行取0,判断列的状态 */ line = line << 1; if (line == 0x10) { /* 最后一行,无键 */ return 0xff; } } } while (row == 0xf0); line = ~line & 0x0f; kscan = line | row; return kscan; } } return 0xff; } // 行列反转法 uchar keyRowLine() { P1 = 0x0f; line = P1; if (line != 0x0f) { /* 判断行状态 */ delay1ms(20); line = P1; if (line != 0x0f) { /* 有按键按下 */ line = line & 0x0f; P1 = 0xf0; delay1ms(1); //等待变化时间 row = P1; row = row & 0xf0; kscan = line | row; return kscan; } } return 0xff; } // 获得键编码 void getKeyVaule() { uchar Kscan; // Kscan = keyScanning(); Kscan = keyRowLine(); switch (Kscan) { case 0xee: kvalue = 0; break; case 0xde: kvalue = 1; break; case 0xbe: kvalue = 2; break; case 0x7e: kvalue = 3; break; case 0xed: kvalue = 4; break; case 0xdd: kvalue = 5; break; case 0xbd: kvalue = 6; break; case 0x7d: kvalue = 7; break; case 0xeb: kvalue = 8; break; case 0xdb: kvalue = 9; break; case 0xbb: kvalue = 10; break; case 0x7b: kvalue = 11; break; case 0xe7: kvalue = 12; break; case 0xd7: kvalue = 13; break; case 0xb7: kvalue = 14; break; case 0x77: kvalue = 15; break; default: break; } } /*矩阵按键函数*/ // 按键函数,单个。 void key_board() { P1 = 0xff; if (0xff != P1) { delay1ms(20); if (0xff != P1) { flag++; } } while (0xff != P1) { /* code */ } } // 主函数 void main() { TMOD = 0X10; EA = 1; ET1 = 1; TR1 = 1; while (1) { /* code */ } } // 锯齿波 void sawtooth() { TH1 = (65536 - 1000) / 256; TL1 = (65536 - 1000) % 256; DAC0832 = dat; dat++; } // 方波 void square() { TH1 = (65536 - 2000) / 256; TL1 = (65536 - 2000) % 256; i++; if (i % 2) { dat = 0x00; //0v } else { dat = 0xcc; //4v } DAC0832 = dat; } // 三角波 void triangle() { TH1 = (65536 - 500) / 256; TL1 = (65536 - 500) % 256; j++; if (j >= 0 && j < 0xff) { dat++; } else { dat--; } if (dat == 0) { j = 0; } DAC0832 = dat; } // 中断函数 void timer1() interrupt 3 { // key_board(); getKeyVaule(); if (kvalue == 0) { sawtooth(); } else if (kvalue == 1) { square(); } else if (kvalue == 2) { triangle(); } }
|
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
598浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 19:57 , Processed in 1.030120 second(s), Total 77, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号