




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PC104工控机DOS串口通讯源码(中断收发) 2008-3-21 10:26:00 | By: dmjkun 3推荐PC104工控机DOS平台下串口1及串口2源码(中断收发) 已通过BC3.1及BC4.5编译void Com1RecvData( void )uchar temp;static uchar MsgLen;temp = inportb(COM1_RBR_ADDR); TimerTIMER_GIB_TO.Tick = 10;TimerTIMER_GIB_TO.Flg.BIT.Enable = 1;if( GibStrFlg=0 )if( temp=0xaa )GibStrFlg = 1;GibBuf.RecvPtr = 0;GibBuf.RecvBufGibBuf.RecvPtr+ = temp;GibBuf.Error.byte = 0;elseif( temp=0xab & GibBuf.RecvPtr=MsgLen+1 )GibStrFlg = 0;GibBuf.RecvBufGibBuf.RecvPtr+ = temp;GibBuf.Flg.BIT.Recv = 1;GibBuf.RecvLen = GibBuf.RecvPtr;else if( GibBuf.RecvPtr = 1)GibBuf.RecvBufGibBuf.RecvPtr+ = temp;MsgLen = temp;else if( GibBuf.RecvPtrMsgLen+2 )GibBuf.RecvBufGibBuf.RecvPtr+ = temp;elseGibBuf.RecvPtr = 0;GibStrFlg = 0;void Com2RecvData( void )uchar temp;static uchar MsgLen;temp = inportb(COM2_RBR_ADDR);TimerTIMER_HOST_TO.Tick = 10;TimerTIMER_HOST_TO.Flg.BIT.Enable = 1;if( HostStrFlg=0 )if( temp=0xaa )HostStrFlg = 1;HostBuf.RecvPtr = 0;HostBuf.RecvBufHostBuf.RecvPtr+ = temp;HostBuf.Error.byte = 0;elseif( temp=0xab & HostBuf.RecvPtr=MsgLen+1 )HostStrFlg = 0;HostBuf.RecvBufHostBuf.RecvPtr+ = temp;HostBuf.Flg.BIT.Recv = 1;HostBuf.RecvLen = HostBuf.RecvPtr;else if( HostBuf.RecvPtr=1 )HostBuf.RecvBufHostBuf.RecvPtr+ = temp;MsgLen = temp;else if( HostBuf.RecvPtrMsgLen+2 )HostBuf.RecvBufHostBuf.RecvPtr+ = temp;elseHostBuf.RecvPtr = 0;HostStrFlg = 0;void Com1SendData( void )if( GibBuf.SendPtrGibBuf.SendLen )outportb ( COM1_THR_ADDR, GibBuf.SendBufGibBuf.SendPtr+ );elseoutportb( COM1_IER_ADDR, 0x05&inportb ( COM1_IER_ADDR ) );void Com2SendData( void )if( HostBuf.SendPtrHostBuf.SendLen )outportb ( COM2_THR_ADDR, HostBuf.SendBufHostBuf.SendPtr+ );elseoutportb( COM2_IER_ADDR, 0x05&inportb(COM2_IER_ADDR) );void CopyToCom1SendBuf( uchar *ptr, uchar len )uchar i;for( i=0; ilen; i+ )GibBuf.SendBufi = ptri;GibBuf.SendPtr = 0;GibBuf.SendLen = len;outportb( COM1_IER_ADDR, 0x02|inportb ( COM1_IER_ADDR ) );void CopyToCom2SendBuf( uchar *ptr, uchar len )uchar i;for( i=0; ilen; i+ )HostBuf.SendBufi = ptri;HostBuf.SendLen = len;HostBuf.SendPtr = 0;outportb( COM2_IER_ADDR, 0x02|inportb ( COM2_IER_ADDR ) );void Com1Init( void )ComOpen(COM1,9600);void Com2Init( void )ComOpen(COM2,19200);void ComInit( void )outportb ( 0x20, 0x20 );/Com1Init();Com2Init();TimerTIMER_GIB_TO.TimeBase = 1;TimerTIMER_HOST_TO.TimeBase = 1;/PrintfComReg();void interrupt Com1_ISR ( _argu )char iir;inportb(COM1_MCR_ADDR);inportb(COM1_MSR_ADDR);iir = inportb ( COM1_IIR_ADDR );inportb(COM1_RBR_ADDR);inportb(COM1_IIR_ADDR);switch( iir )case ModernChange:break;case SendEmpty:Com1SendData();break;case ReceiveOverflow:Com1RecvData();break;case ReceiveError:break;default:break;outportb ( 0x20, 0x20 );/HOSTvoid interrupt Com2_ISR ( _argu )char iir;inportb(COM2_MCR_ADDR);inportb(COM2_MSR_ADDR);iir = inportb ( COM2_IIR_ADDR );switch( iir )case ModernChange:break;case SendEmpty:Com2SendData();break;case ReceiveOverflow:Com2RecvData();break;case ReceiveError:break;default:break;outportb ( 0x20, 0x20 );void ComClose ( unsigned char port ) /* restore previous settings of 8259 */if( port=1 )outportb ( INTCONT, COM1_DB_MASK | inportb ( INTCONT ) );/* Disable com interrupt at 8259 */setvect ( COM1_INT_VTR, Com1OldVetr ); /* Reset original interrupt vector */else if( port=2 )outportb ( INTCONT, COM2_DB_MASK | inportb ( INTCONT ) );/* Disable com interrupt at 8259 */setvect ( COM2_INT_VTR, Com2OldVetr ); /* Reset original interrupt vector */void SetBaud ( unsigned char port, unsigned baudrate ) unsigned char portval;unsigned char blo, bhi; switch ( baudrate ) case 50: bhi = 0x9; blo = 0x00; break;case 75: bhi = 0x6; blo = 0x00; break; case 110: bhi = 0x4; blo = 0x17; break; case 150: bhi = 0x3; blo = 0x00; break; case 300: bhi = 0x1; blo = 0x80; break; case 600: bhi = 0x0; blo = 0xC0; break; case 1200: bhi = 0x0; blo = 0x60; break;case 1800: bhi = 0x0; blo = 0x40; break; case 2000: bhi = 0x0; blo = 0x3A; break; case 2400: bhi = 0x0; blo = 0x30; break;case 4800: bhi = 0x0; blo = 0x18; break;case 9600: bhi = 0x0; blo = 0x0C; break;case 19200: bhi = 0x0; blo = 0x06; break;default:return;if( port=1 )portval = inportb ( COM1_LCR_ADDR ); /* read Line-Control Reg val */outportb ( COM1_LCR_ADDR, portval | 0x80 ); /* set high bit for baud init */outportb ( COM1_BAUD_LOW, blo ); /* Send LSB for baud rate */outportb ( COM1_BAUD_HIGH, bhi ); /* Send MSB for baud rate */outportb ( COM1_LCR_ADDR, portval ); /* Reset initial value at LCR */else if( port=2 )portval = inportb ( COM2_LCR_ADDR ); /* read Line-Control Reg val */outportb ( COM2_LCR_ADDR, portval | 0x80 ); /* set high bit for baud init */ outportb ( COM2_BAUD_LOW, blo ); /* Send LSB for baud rate */ outportb ( COM2_BAUD_HIGH, bhi ); /* Send MSB for baud rate */outportb ( COM2_LCR_ADDR, portval ); /* Reset initial value at LCR */* installs comm interrupts */int ComOpen ( int port, unsigned speed ) int be = biosequip( ); /* to get # installed serial ports */be = 13; /* shift down to low bits */if ( be = port | port = 3) if ( port = 1 ) outportb ( COM1_IER_ADDR, 0x00 );Com1OldVetr = getvect ( COM1_INT_VTR ); /* Save old int vector */setvect( COM1_INT_VTR, Com1_ISR );/* Set up SERINT as com ISR */outportb ( COM1_LCR_ADDR, 0x3 ); /* 8 bits no parity */inportb ( COM1_RBR_ADDR );outportb ( COM1_IER_ADDR, 0x01 ); /* Receiver-Data-Ready int */outportb( COM1_MCR_ADDR, 0x08 );outportb ( INTCONT, COM1_EN_MASK & inportb ( INTCONT ) );/* Enable 8259 interrupts */else if ( port = 2 )outportb ( COM2_IER_ADDR, 0x00 );Com2OldVetr = getvect ( COM2_INT_VTR );/* Save old int vector */setvect( COM2_INT_VTR, Com2_ISR );/* Set up SERINT as com ISR */outportb ( COM2_LCR_ADDR, 0x3 ); /* 8 bits no parity */inportb ( COM2_RBR_ADDR );outportb ( COM2_IER_ADDR, 0x01 ); /* Receiver-Data-Ready int */outportb ( COM2_MCR_ADDR, 0x08 );outportb ( INTCONT, COM2_EN_MASK & inportb ( INTCONT ) );/* Enable 8259 interrupts */elsereturn ( 0 );SetBaud( port, speed ); /* set baud */elsebe = 0; return ( be );阅读全文(1702) | 回复(0) |反映问题 | 引用通告(0) | 编辑pc104工控机DOS平台下定时中断服务程序 2008-3-21 10:31:00 | By: dmjkun 1推荐pc104工控机DOS平台下定时中断服务程序,可改变定时中断发生时间void interrupt Timer_ISR ( _argu )TimeUpFlg = 1;outportb(0x20,0x20);void ResumeTimerVtr( void )/程序结束,恢复原来的中断向量setvect( TIM_INT_VTR, TimerOldVetr );outportb(0x43,0x36);outport(0x40,0);outport(0x40,0);void TimerInit( void )WORD clkdiv;clkdiv = 1193180/1000;/ 1000us 中断发生时间TimerOldVetr = getvect ( TIM_INT_VTR ); /* Save old int vector */setvect( TIM_INT_VTR, Timer_ISR ); /Timer_ISR为中断服务程序outportb(0x43,0x36);outport(0x40,clkdiv&0x00ff);outport(0x40,(clkdiv8)&0x00ff);怎样用C语言编写一个DOS下的中断服务程序 做IT就要做精英,至少4000/月吧?JAVAV工程师权威认证上海央邦学一送一,超值! 【安博亚威】CCIE考试通过率第一!定向委培RHCA,通过考试年薪10WWindows高级工程师的培训地 中国IT实验室收集整理 佚名 2008-6-30 保存本文 推荐给好友 收藏本页 欢迎进入C/C+编程社区论坛,与200万技术人员互动交流 进入 TC本身提供中断程序的接口,函数名记不清了,大概的过程是定义一个函数作为中断的处理程序,然后调用TC自己的函数(可以在DOS.H或BIOS.H中找到,名称与Interrupt有关) /keys.cpp / 按键表索引发: / 首先建立key_table作为按键表,然后根据按键扫描码改变key_table中的状态, / 这样key_table中所有对应的索引按键即为需要的组合键。 / 以下程序仅对上、下、左、右四个光标键做了组合按键的处理。 / 本程序在Borland C+ 3.1 中调试通过。 #include #include #include #define ESC 1 #define UP 72 #define _UP 200 #define DOWN 80 #define _DOWN 208 #define LEFT 75 #define _LEFT 203 #define RIGHT 77 #define _RIGHT 205 #define NUM_KEYS 4 #define INDEX_UP 0 #define INDEX_DOWN 1 #define INDEX_LEFT 2 #define INDEX_RIGHT 3 #ifdef _cplusplus #define _CPPARGS. #else #define _CPPARGS #endif char * key_table_nameNUM_KEYS = UP,DOWN,LEFT,RIGHT ; int key_scan_code; / 键盘扫描码 int key_tableNUM_KEYS; / 按键表 class INTERRUPT / 定义中断类 int INT; void far interrupt ( *Old_Int)(_CPPARGS); public: void BEGIN_INT(int Int,void far interrupt(*New_Int)(_CPPARGS); void END_INT(void); ; void INTERRUPT:BEGIN_INT(int Int,void far interrupt(*New_Int)(_CPPARGS) / 开始自定义中断处理 INT = Int; Old_Int = getvect(INT); setvect(INT,New_Int); void INTERRUPT:END_INT(void) / 结束自定义中断处理 setvect(INT,Old_Int); void far interrupt special_key(_CPPARGS)/ 自定义中断处理函数 int status; key_scan_code = inp(0x60); / 读键盘扫描码 status = inp(0x61); / 读键盘状态 outp(0x61,status and 0x80); / 置位7并写 outp(0x61,status); / 再写位7 outp(0x20,0x20); / 复位PIC switch(key_scan_code) / 记录光标键,设置key_table中的状态 / 1为按下键,0为松开键 case UP: key_tableINDEX_UP = 1; break; case _UP: key_tableINDEX_UP = 0; break; case DOWN: key_tableINDEX_DOWN = 1; break; case _DOWN: key_tableINDEX_DOWN = 0; break; case LEFT: key_tableINDEX_LEFT = 1; break; case _LEFT: key_tableINDEX_LEFT = 0; break; case RIGHT: key_tableINDEX_RIGHT = 1;break; case _RIGHT:key_tableINDEX_RIGHT = 0;break; void init_key_table(void) / 初始化键盘表 register i; for(i=0;iNUM_KEYS;i+) key_tablei=0; void main(void) int i; INTERRUPT KEY; init_key_table(); clrscr(); KEY.BEGIN_INT(9,special_key); printf(Play with the arrow keys,press ESC to quit.n); while(key_scan_code != ESC) gotoxy(5,5); printf(Key scancode: %d,key_scan_code); gotoxy(5,10); printf(Key name:); for(i=0;iNUM_KEYS;i+) if(key_tablei != 0) printf(%s,key_table_namei); printf(%10c, ); printf(n); KEY.END_INT(); return; 有事KAO我,QQ:504988247在这里就由我开个头:首先你启动 Quick Basic 时必须加上 /l 参数,如果你是4.5的版本键入 qb/l ,如果是7.1 版本则键入 qbx/l,在程序的开头写上一行:$INCLUDE: QB.BI(4.5版本)$INCLUDE: QBX.BI(7.1版本)QB调用中中断用:1. Interrupt 中断号,输入参数,返回参数 2. InterruptX 中断号,输入参数,返回参数 说明:中断号为 0255 如鼠标为 51 参数用 REGTYPE这几句可以取得当前DOS的版本:DIM Regs AS RegTypeXRegs.ax = &H3000INTERRUPTX &H21, Regs, RegsDosVersion$ = LTRIM$(STR$(Regs.ax MOD 256) + . + LTRIM$(STR$(INT(Regs.ax / 256)下面的可以获得软驱的信息:DIM reg AS RegTypereg.ax = &H100INTERRUPT &H13, reg, regIF reg.ax MOD 256 0 THENDEF SEG = 0N% = PEEK(&H43E)DEF SEGIF N% AND 1 0 THEN Count% = 1IF N% AND 2 0 THEN Count% = Count% + 1SoftDiskCount% = Count%END IF 回答者:chen_k_y - 经理 四级 12-27 01:45-PC的键盘是一个智能化的键盘,它相当于一部完整的计算机,键盘内有一片Intel 8048(或8049)单片机(处理器)对整个键盘上的字符键、功能键、控制键和组合键进行管理,当在键盘上按下一个键时,键盘上的处理器首先向计算机主机发出硬件中断请求,然后将该键的扫描码以串行的方式传送给计算机主机,计算机主机在硬件中断的作用下,调用INT 09H硬件中断把键盘送来的扫描码读入,并转换为ASCII码存入键盘缓冲区中。按下一个键,送出一个闭合码,键被释放时送出一个断开码,键盘处理中断程序从键盘I/O端口(端口地址为60H)读取一个字节的数据,如果读取的数据的第7位为1时表示按键已放开(送出断开码),如第7位为0表示键按下(送出闭合码),数据的第06位则为按键的扫描码。键盘上的每一个键都对应一个扫描码,根据扫描码就能唯一的确定一个键。键盘缓冲区位于0040:001EH -4000:003EH之间的BIOS数据区,长度为34个字节,是一个先进后出的循环队列。使用PC机原有的键盘处理程序可以很方便地处理键盘,但是因为它是调用BIOS,所以反应比较慢,另外当我们要同时处理几个按键时(例如同时按下Up箭头键和Left箭头键沿对角线运动),原有的键盘中断程序就不能满足要求,这时就需要编写一个适合我们要求的键盘中断程序。编写新的键盘中断程序要做以下几项工作:1进入键盘中断程序。2从键盘I/O端口60H读取一个字节的按键码,并将它存入一个全局变量中供main程序处理,或者将按键码存入一个数据表中。3读取控制寄存器61H,并用82h完成一个OR操作。4将结果写回控制寄存器端口61H。5在控制寄存器上用7fh完成一个AND操作,以便复位键盘触发器,告诉硬件一个按键已被处理,可以读下一个键了。6复位中断控制器8259,向端口20h写一个20h。7退出键盘中断程序。我们先定义一组宏常量记录键值,它包括128个键盘扫描码:#define KEY_A 0x1E#define KEY_B 0x30#define KEY_C 0x2e#define KEY_D 0x20#define KEY_E 0x12#define KEY_F 0x21#define KEY_G 0x22#define KEY_H 0x23#define KEY_I 0x17#define KEY_J 0x24#define KEY_K 0x25#define KEY_L 0x26#define KEY_M 0x32#define KEY_N 0x31#define KEY_O 0x18#define KEY_P 0x19#define KEY_Q 0x10#define KEY_R 0x13#define KEY_S 0x1f#define KEY_T 0x14#define KEY_U 0x16#define KEY_V 0x2f#define KEY_W 0x11#define KEY_X 0x2d#define KEY_Y 0x15#define KEY_Z 0x2c#define KEY_1 0x02#define KEY_2 0x03#define KEY_3 0x04#define KEY_4 0x05#define KEY_5 0x06#define KEY_6 0x07#define KEY_7 0x08#define KEY_8 0x09#define KEY_9 0x0a#define KEY_0 0x0b#define KEY_DASH 0x0c /* _- */#define KEY_EQUAL 0x0d /* += */#define KEY_LBRACKET 0x1a /* */#define KEY_RBRACKET 0x1b /* */#define KEY_SEMICOLON 0x27 /* :; */#define KEY_RQUOTE 0x28 /* */#define KEY_LQUOTE 0x29 /* */#define KEY_PERIOD 0x33 /* . */#define KEY_COMMA 0x34 /* , */#define KEY_SLASH 0x35 /* ?/ */#define KEY_BACKSLASH 0x2b /* | */#define KEY_F1 0x3b#define KEY_F2 0x3c#define KEY_F3 0x3d#define KEY_F4 0x3e#define KEY_F5 0x3f#define KEY_F6 0x40#define KEY_F7 0x41#define KEY_F8 0x42#define KEY_F9 0x43#define KEY_F10 0x44#define KEY_ESC 0x01#define KEY_BACKSPACE 0x0e#define KEY_TAB 0x0f#define KEY_ENTER 0x1c#define KEY_CONTROL 0x1d#define KEY_LSHIFT 0x2a#define KEY_RSHIF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五Oracle企业数字化转型咨询服务协议
- 二零二五年度二次结构工程材料供应合同范本下载
- 二零二五年度建筑工地民工劳动权益保护及法律援助合同
- 二零二五年度建筑工程造价咨询委托协议书
- 二零二五年度建筑公司整体转让及安全管理合同
- 二零二五年度文化产业项目劳务派遣合作合同
- 二零二五年度物流快递车辆加盟服务合同
- 2025至2030年中国黑龙江省房地产市场深度分析及投资战略咨询报告
- 二零二五年度高科技项目工程战略合作协议书
- 2025版办公楼物业综合服务及设施设备更新改造合同模板
- 2023施工技术交底编制与管理标准培训
- 物业管理考核细则-
- GB/T 3683-2023橡胶软管及软管组合件油基或水基流体适用的钢丝编织增强液压型规范
- 医疗器械2017版与2002版器械分类目录对照表
- 2019火灾自动报警系统施工及验收标准
- 仓储中暑应急演练预案方案
- 新概念第一册双数课文
- 义教课程标准(2022年版)解读·徐蓝
- SPC CPK超全EXCEL模板完整版可编辑
- 渠道一百软件2012战略合作伙伴推广计划课件
- 2023年邢台沙河市体育教师招聘笔试模拟试题及答案
评论
0/150
提交评论