完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛
|
看看 期待收藏起来慢慢研究!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
程序格式清晰描述很詳細,期待續集。偶是初學的先拿去學習了。
|
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2014-6-8 09:01 编辑
建议你看我最新开的技术贴《从业将近十年!手把手教你单片机程序框架(连载)》。 |
|
|
|
|
|
|
|
|
本帖最后由 TXWSDZFSY 于 2014-3-29 18:50 编辑
鸿哥V5! 学习鸿哥的帖子很久了。可第十一节讲的12864液晶,我用51单片机折腾了快一个月了,也没能让它显示出来 烦请鸿哥抽空解答指点一下,如下面程序,没有错误,也没警告,就是不显示#include #include typedef unsigned char uint8; typedef unsigned int uint16; const uint8 ***816_v[]={0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08, 0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00}; /*硬件连接*/ ***it RS_dr = P1^4; //模式位,为0输入指令,为1输入 数据 ***it RW_dr = P1^2; //读写位,为0读,为1写 ***it EN_dr = P1^5; //使能端 ***it CS1_dr = P1^0; //左半屏使能,高电平有效 ***it CS2_dr = P1^1; //右半屏使能,低电平有效 ***it BUSY = P0^7; #define LCD_BUS P0 //数据总线 /*重新给各命令声明*/ #define Disp_on 0x3f //显示开; #define Disp_off 0x3e //显示关; #define Col_add 0x40 //列设置; #define Page_add 0xb8 //页设置; #define Start_line 0xc0 //起始行设置; /*函数声明*/ void init_myself(); void delay_long(uint16 t); void delay_short(uint8 t); void init_peripheral(); void screen_clear (); void chk_busy(); void write_cmd(uint8 m); void write_data(uint8 m); void show_***(uint8 col,uint8 pag, const uint8 *zk, uint8 opposite_flag); void main() { init_myself(); delay_long(100); init_peripheral(); while(1) { screen_clear (); CS1_dr = 1; CS2_dr = 0; show_***(32,0,***816_v,0); while(1); } } /*底层函数 测忙*/ void chk_busy() { RW_dr = 1; RS_dr = 0; LCD_BUS = 0xff; delay_short(1); EN_dr = 1; while(BUSY); EN_dr = 0; } /*底层函数 写命令*/ void write_cmd(uint8 m) { chk_busy(); RW_dr = 0; RS_dr = 0; LCD_BUS = m; delay_short(1); EN_dr = 1; delay_short(1); EN_dr = 0; } /*底层函数 写数据*/ void write_data(uint8 m) { chk_busy(); RW_dr = 0; RS_dr = 1; LCD_BUS = m; delay_short(1); EN_dr = 1; delay_short(1); EN_dr = 0; } /*初始化单片机*/ void init_myself() { P0 = 0xff; } /*长延时*/ void delay_long(uint16 t) { uint16 i,j; for(i = 0; i < t; i++) for(j = 0; j < 500; j++); } /*短延时*/ void delay_short(uint8 t) { uint8 i,j; for(i = 0; i < t; i++) for(j = 0; j < 50; j++); } /*初始化外围设备*/ void init_peripheral() { CS1_dr=1; //左6464屏初始化 CS2_dr=0; delay_short(1); write_cmd(Disp_off); write_cmd(Page_add + 0); write_cmd(Col_add + 0); write_cmd(Start_line + 0); write_cmd(Disp_on); CS1_dr = 0; CS2_dr = 1; delay_short(1); write_cmd(Disp_off); write_cmd(Page_add + 0); write_cmd(Col_add + 0); write_cmd(Start_line + 0); write_cmd(Disp_on); } /*清空液晶屏*/ void screen_clear () { uint8 j,i; CS1_dr = 1; CS2_dr = 0; //选择左屏6464 for(j =0; j <8; j ++) //此处的j代表Y轴的坐标,范围是(0到7),(64/8)-1=7. { write_cmd(Page_add + j); //设定Y轴的起始位置,切换到下一行 write_cmd(Col_add + 0); //设定X轴的起始位置,每次换行都从0开始 for(i=0; i <64; i ++) //此处i代表X轴,每发送一个显示数据,X轴内部的位置会自动//加一,范围是(0到63),64-1=63 { write_data(0x00); //都显示空内容,达到清空的目的 } } CS1_dr = 0; CS2_dr = 1; //选择右屏6464 for(j =0; j <8; j ++) //此处的j代表Y轴的坐标,范围是(0到7),(64/8)-1=7. { write_cmd(Page_add + j); //设定Y轴的起始位置,切换到下一行 write_cmd(Col_add + 0); //设定X轴的起始位置,每次换行都从0开始 for(i=0; i <64; i ++) //此处i代表X轴,每发送一个显示数据,X轴内部的位置会自动//加一,范围是(0到63),64-1=63 { write_data(0x00); //都显示空内容,达到清空的目的 } } } /*显示字符*/ void show_***(uint8 col,uint8 pag, const uint8 *zk, uint8 opposite_flag) { uint8 j=0,i=0; for(j=0;j<2;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个8X16字符只占用//两行,每行8个点,两行的高度就是16个点, { write_cmd(Page_add +pag + j);//换下一行Y轴的坐标 write_cmd(Col_add + col); //每次换行都重新设定X轴的坐标, for(i=0;i<8;i++) //此处i代表X轴的数据,每发送一个显示数据,X轴位置会自动加/////一,因为一个字符的宽度是8个点,因此范围是(0到7),8-1=7. { if(opposite_flag ==1) //反显 { write_data(~zk [8*j+i]); //发送显示的字节数据,纵向显示八个点,一行8个///点,因此8*j } else //正显 { write_data(zk [8*j+i]); //发送显示的字节数据,纵向显示八个点 ,一行8个点,//因此8*j } } } } |
|
|
|
|
|
|
|
|
鸿哥 问下 你这个短按 长按程序 如果一直按着的话 会响2次吧 应该!不知道我说的对不对! 达到短按时间 蜂鸣器短叫一次 手没放的话达到长按的时间 蜂鸣器长叫一次! 而你的 要实现的功能是 短按 短叫一次 长按 长叫一次… 希望鸿哥指教?是不是我哪边理解错了? |
|
|
|
|
|
|
|
|
短按松手后才算触发一次短按。 一直长按只会触发一次长按,中间不会触发短按。 |
|
|
|
|
|
|
|
|
本帖最后由 gg157551 于 2014-4-5 10:32 编辑
鸿哥 今天突然看您这节程序时 突然想到if…else…语句 想问下 比如你这段程序里面的2个红色字体 else if 可以就用成 if 可以吗?感觉都有点乱了!还没掌握if else 语句实质! 今天翻书看了也没看出啥来!还请鸿哥指教! void key_scan() //按键扫描函数 { if(key_value>cnt_key_nc) //空闲,没有按下 { key_lock1=0; //按键自锁标志清零 delay_cnt1=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock1==0) //有按键按下,且是第一次被按下 { if(key_value ++delay_cnt1; //延时计数器 If(delay_cnt1>cnt_delay_cnt1) { delay_cnt1=0; key_lock1=1; //自锁按键置位,避免一直触发 key_sec=1; //触发1号键 } } else if(key_value> cnt_key2_down&&key_value< cnt_key2_up) //K2按下 { ++delay_cnt1; //延时计数器 If(delay_cnt1>cnt_delay_cnt1) { delay_cnt1=0; key_lock1=1; //自锁按键置位,避免一直触发 key_sec=2; //触发2号键 } } else if(key_value> cnt_key3_down&&key_value< cnt_key3_up) //K3按下 { ++delay_cnt1; //延时计数器 If(delay_cnt1>cnt_delay_cnt1) { delay_cnt1=0; key_lock1=1; //自锁按键置位,避免一直触发 key_sec=3; //触发3号键 } } } 我感觉这2处都直接用成if 也没啥区别吧 鸿哥???就目前的程序里这种AD按键假如2个键或者3个键同时按下会驱动哪号键呢? 这个用if 跟else if 会不会在几个键同时按这方面有点区别? |
|
|
|
|
|
|
|
|
AD按键在实际项目中很少用,那么多年,我只遇到过一个项目是用AD按键的。AD按键不识别多个按键同时按下来的,如果非要同时按下来,这个情况应该是不太确定到底触发哪一个。 |
|
|
|
|
|
|
|
|
哦 谢谢鸿哥. 那上面的 两个红色 else if 可以直接 改成 if 吗 ? 我感觉可以!不知鸿哥意下如何? |
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2014-4-5 22:07 编辑
这个程序中不可以,因为都用 同样的delay_cnt1这个变量名,除非你把这个变量名改成各自不同的,包括key_lock1等变量名,你可能还要改很多内容才行。如果你有硬件平台可以自己测试一下,否则不建议过多关注和纠结于此,没有硬件平台来讨论这个程序相当于纸上谈兵。如果你是初学者,建议你看我另外一个技术贴《吴坚鸿风格的C51程序》,这里面的所有程序我都亲自在朱兆祺的51学习板上测试过。 |
|
|
|
|
|
|
|
|
谢谢鸿哥! 这几天在把鸿哥的程序往开发板上弄,之前没碰到鸿哥 买的郭天祥的板子!在弄鸿哥的程序的时候 有时偷懒 夹杂着老郭的一些程序模块!郁闷 的是老是没结果,实现不了预期效果 郁闷之极!气晕了都呵呵!难道这就是程序的不兼容???鸿哥 你的开发板在哪买?淘宝吗?还是?准备把鸿哥的程序都实现一遍准备辞职找单片机的工作了!求鼓励呵呵! |
|
|
|
|
|
|
|
|
在淘宝上输入“朱兆祺51学习板”就可以找到了。 |
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2014-6-8 09:01 编辑
建议你学我另外一个最新版本的技术贴《从业将近十年!手把手教你单片机程序框架(连载)》 ,这里面的程序我全部上朱兆祺的学习板上运行过,而且思路更加严密清晰。 |
|
|
|
|
|
|
|
|
本帖最后由 friend0720 于 2016-2-25 18:18 编辑
!!!!!!!!!!!!!!!!!!!!! |
|
|
|
|
|
|
|
|
借宏哥宝地,发一个本人的指纹识别演示程序,内附中科院指纹库(由于文件大小限制原因,删除部分指纹),欢迎技术交流。
|
|
|
|
|
|
|
|
|
鸿哥,我一直关注你C51的连载,现在发现之前PIC你也有连载,而且还每次提问都回答了,谢谢。。顺便问一下PIC的连载这些程序里都有经过上机测试的吗?
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2381 浏览 1 评论
4238 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2618 浏览 2 评论
3115 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4572 浏览 5 评论
有套STM32与西门子200程序需要代写,有兴趣的工程师与有联系!
2484浏览 1评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6796浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 23:02 , Processed in 1.539255 second(s), Total 85, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖